package com.school.sports.service;

import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import javax.imageio.IIOImage;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

/**
 * 图片处理服务接口
 */
public interface ImageProcessingService {

    /**
     * 压缩图片
     * @param imageFile 原始图片文件
     * @param quality 压缩质量（0.0-1.0）
     * @param maxWidth 最大宽度
     * @param maxHeight 最大高度
     * @return 压缩后的图片字节数组
     */
    byte[] compressImage(MultipartFile imageFile, float quality, int maxWidth, int maxHeight) throws IOException;

    /**
     * 调整图片尺寸
     * @param imageFile 原始图片文件
     * @param width 目标宽度
     * @param height 目标高度
     * @param keepAspectRatio 是否保持宽高比
     * @return 调整尺寸后的图片字节数组
     */
    byte[] resizeImage(MultipartFile imageFile, int width, int height, boolean keepAspectRatio) throws IOException;

    /**
     * 生成缩略图
     * @param imageFile 原始图片文件
     * @param thumbnailWidth 缩略图宽度
     * @param thumbnailHeight 缩略图高度
     * @return 缩略图字节数组
     */
    byte[] generateThumbnail(MultipartFile imageFile, int thumbnailWidth, int thumbnailHeight) throws IOException;

    /**
     * 添加水印
     * @param imageFile 原始图片文件
     * @param watermarkText 水印文字
     * @param position 水印位置（top-left, top-right, bottom-left, bottom-right, center）
     * @param opacity 透明度（0.0-1.0）
     * @return 添加水印后的图片字节数组
     */
    byte[] addWatermark(MultipartFile imageFile, String watermarkText, String position, float opacity) throws IOException;

    /**
     * 图片格式转换
     * @param imageFile 原始图片文件
     * @param targetFormat 目标格式（jpg, png, gif等）
     * @return 转换格式后的图片字节数组
     */
    byte[] convertImageFormat(MultipartFile imageFile, String targetFormat) throws IOException;

    /**
     * 获取图片信息
     * @param imageFile 图片文件
     * @return 图片信息Map（包含宽度、高度、格式等）
     */
    Map<String, Object> getImageInfo(MultipartFile imageFile) throws IOException;

    /**
     * 批量处理图片
     * @param imageFiles 图片文件列表
     * @param operation 处理操作类型（compress, resize, thumbnail, watermark）
     * @param params 处理参数
     * @return 处理后的图片字节数组列表
     */
    Map<String, byte[]> batchProcessImages(MultipartFile[] imageFiles, String operation, Map<String, Object> params) throws IOException;

    /**
     * 图片裁剪
     * @param imageFile 原始图片文件
     * @param x 裁剪起始X坐标
     * @param y 裁剪起始Y坐标
     * @param width 裁剪宽度
     * @param height 裁剪高度
     * @return 裁剪后的图片字节数组
     */
    byte[] cropImage(MultipartFile imageFile, int x, int y, int width, int height) throws IOException;

    /**
     * 图片旋转
     * @param imageFile 原始图片文件
     * @param angle 旋转角度（度数）
     * @return 旋转后的图片字节数组
     */
    byte[] rotateImage(MultipartFile imageFile, double angle) throws IOException;

    /**
     * 图片翻转
     * @param imageFile 原始图片文件
     * @param direction 翻转方向（horizontal, vertical）
     * @return 翻转后的图片字节数组
     */
    byte[] flipImage(MultipartFile imageFile, String direction) throws IOException;

    /**
     * 调整图片亮度
     * @param imageFile 原始图片文件
     * @param brightness 亮度调整值（-100到100）
     * @return 调整亮度后的图片字节数组
     */
    byte[] adjustBrightness(MultipartFile imageFile, int brightness) throws IOException;

    /**
     * 调整图片对比度
     * @param imageFile 原始图片文件
     * @param contrast 对比度调整值（-100到100）
     * @return 调整对比度后的图片字节数组
     */
    byte[] adjustContrast(MultipartFile imageFile, int contrast) throws IOException;

    /**
     * 图片灰度化
     * @param imageFile 原始图片文件
     * @return 灰度化后的图片字节数组
     */
    byte[] convertToGrayscale(MultipartFile imageFile) throws IOException;

    /**
     * 验证图片文件
     * @param imageFile 图片文件
     * @return 验证结果
     */
    boolean validateImage(MultipartFile imageFile);

    /**
     * 获取支持的图片格式列表
     * @return 支持的格式列表
     */
    String[] getSupportedFormats();
}